package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import com.itheima.reggie.common.PageResult;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.exception.BusinessException;
import com.itheima.reggie.mapper.EmployeeMapper;

import com.itheima.reggie.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;

import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;
import java.util.List;

/*
* 员工业务处理接口实现类
* */

@Service
@Transactional
@Slf4j
public class EmployeeServiceImpl implements EmployeeService {
    @Autowired
    private EmployeeMapper employeeMapper;

    /*
    * 员工登录
    *
    * @param employee
    * @return
    * */
    @Override
    public R<Employee> login(Employee employee, HttpSession session){
        String password = employee.getPassword();   //用户在页面输入明文密码
        String username = employee.getUsername();   //用户在页面输入的登录用户名
        //1、将页面提交的密码password进行md5加密处理
        //spring提供的工具类对用户输入的密码进行加密
        String userInputPassword = DigestUtils.md5DigestAsHex(password.getBytes());
        //2、根据页面提交的用户名username查询数据库
        //2.1、构造查询条件username=admin查询员工对象
        //构建条件方式一：
//        QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("username",username);
        //构建条件方式二：（推荐使用）
        LambdaQueryWrapper<Employee> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Employee::getUsername,username);
        Employee ey =employeeMapper.selectOne(lambdaQueryWrapper);
        //3、如果没有查询到则返回登陆失败结果
        if(ey == null){
            return R.error("登录失败了：用户名输入错误");
        }
        //4、密码对比，如果不一致则返回登录失败结果
        String dbPassword = ey.getPassword();
        if(!userInputPassword.equals(dbPassword)){
            return R.error("登录失败了：用户密码输入错误");
        }
        //5、查看员工状态，如果为已禁用状态，则返回员工已禁用结果
        Integer status = ey.getStatus();//1：正常（）：禁用
        if(status == 0){
            return R.error("登陆失败了:您的账号被禁用了");
        }
        //6、登录成功，将员工存入Session并返回登录成功结果
        session.setAttribute("employee",ey);
        return R.success(ey);
    }

    /*
    * 退出功能
    * */
    @Override
    public R<String> logout(HttpSession session){
        //1、清除session中用户信息
        //方式一
        //session.removeAttribute("employee");
        //方式二（推荐使用）
        session.invalidate();
        //2.返回登录成功信息
        return R.success("登出成功了");
    }

    /**
     * 新增员工
     */
    @Override
    public R<String> save(Employee employee, HttpSession session) {
        //查询新增登录用户名在employee表中是否存在
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Employee::getUsername,employee.getUsername());//登录用户名
        Employee ey1 = employeeMapper.selectOne(queryWrapper);
        if(ey1 != null){ //ey不为空 说明登录用户名已经存在
            throw new BusinessException("新增员工失败了，原因：登录用户名已经存在");
        }
        //{"name":"111","phone":"13111222111","sex":"1","idNumber":"123456789012345678","username":"1111"}
        //1补全员工对象中需要各个字段
        //id:主键字段 自动设置值
        //设置密码
        employee.setPassword(DigestUtils.md5DigestAsHex("123".getBytes()));
        //设置状态
        employee.setStatus(1);//1:正常 0：禁用
        //设置创建员工时间
//        employee.setCreateTime(LocalDateTime.now());
        //设置更新员工时间
//        employee.setUpdateTime(LocalDateTime.now());
        //设置谁创建员工id
//        Employee ey = (Employee)session.getAttribute("employee");
//        employee.setCreateUser(ey.getId());
        //设置谁更新员工id
//        employee.setUpdateUser(ey.getId());
        //2调用持久层保存员工数据
        employeeMapper.insert(employee);
        //3 返回新增员工结果
        return R.success("新增员工成功了");
    }

    /**
     * 员工分页
     *
     * @param page
     * @param pageSize
     * @return
     */
    @Override
    public R<PageResult> findPage(Long page, Long pageSize,String name) {
        //a.创建Page对象设置当前页码 每页显示条数
        Page pg = new Page(page,pageSize);
        //b.调用持久层MybatisPlus封装好的分页方法selectPage(page分页对象,分页条件)
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        if(StringUtils.isNotEmpty(name)){
            queryWrapper.eq(Employee::getName,name);
        }
        employeeMapper.selectPage(pg,queryWrapper);
        //c.根据Page对象获取total records封装PageResult对象
        long total = pg.getTotal();
        List records = pg.getRecords();
        PageResult pageResult = new PageResult(total,records);
        return R.success(pageResult);
    }


    /**
     * 修改员工信息
     */
    @Override
    public R<String> update(Employee employee, HttpSession session) {
        long id = Thread.currentThread().getId();
        log.debug("*****************EmployeeServiceImpl************线程id为{}**",id);
        //1.设置更新时间 更新用户人
        //设置更新员工时间
//        employee.setUpdateTime(LocalDateTime.now());
        //设置谁创建员工id
//        Employee ey = (Employee)session.getAttribute("employee");
        //设置谁更新员工id
//        employee.setUpdateUser(ey.getId());
        //2.调用持久层更新员工信息
        employeeMapper.updateById(employee);
        //3.返回结果
        return R.success("更新员工信息成功了");
    }

    /**
     * 根据员工id查询员工对象
     *
     * @param id
     * @return
     */
    @Override
    public R<Employee> findById(Long id) {
        return R.success(employeeMapper.selectById(id));
    }
}
